<?php
/**
 * Page gestion des groupes
 * Permet l'affichage, l'ajout, la suppression et la modification de groupes
 *
 * @category actions
 * @package administration
 *
 * @author M.CASTANHEIRO, M.MEUNIER, O.PATTE, C.PORTEMER, R.THERY-HERMAIN
 * @version 1.0
 */
class groupeAction extends shAction {
    /**
     * Fonction appellée automatiquement pour toutes les requêtes de l'action
     */
    public function init() {
	$this->setTitle('Gestion des groupes');
	$this->addAriane(shRequest::link('administration'), 'Administration');
	$this->addAriane(shRequest::link('administration', 'filiere'), 'Gestion des filières');
    }

    /**
     * Ajout d'un groupe
     */
    public function executeCreate($_id_promotion , $_id_ue=null) {

	// fil d'ariane
	$promotion = shSGBD::selectOne('SELECT id_specialite FROM promotion WHERE id=?',array($_id_promotion));
	$this->addAriane(shRequest::link('administration', 'promotion',null,$promotion->id_specialite), 'Gestion des promotions');
	// FIN Fil d'Ariane

	$this->setTitle('Ajout d\'un groupe');

	$formulaire = new shFormulaire;
	$formulaire->setSubmitText('Valider');

	if ($_id_ue == null) {

	    $ues = shSGBD::select('SELECT id,intitule from ue '.
		    'INNER JOIN assister ON ue.id=assister.id_ue '.
		    'WHERE assister.id_promotion=? '.
		    'ORDER BY intitule ASC',array($_id_promotion));

	    $selectBox = shField::select('Ue')->setRequired(false)->appendTo($formulaire);

	    foreach($ues as $ue) {
		$selectBox->addOption($ue->id,$ue->intitule);
	    }

	}else {
	    $ue = shSGBD::selectOne('SELECT id,intitule from ue WHERE id=? ',array($_id_ue));
	    shField::string('Ue')->setValue($ue->intitule)->appendTo($formulaire);

	    $typeUes = shSGBD::select(
		    'SELECT type_enseignement.id, type_enseignement.intitule '.
		    'FROM type_enseignement '.
		    'INNER JOIN enseignement ON type_enseignement.id=enseignement.id_type_enseignement '.
		    'WHERE enseignement.id_ue=?',
		    array($_id_ue));

	    $selectTypeUe = shField::select('Type enseignement')->setRequired(false)->appendTo($formulaire);

	    foreach ($typeUes as $typeUe) {
		$selectTypeUe->addOption($typeUe->id,$typeUe->intitule);
	    }

	    shField::text('Groupe')->setRequired(true)->appendTo($formulaire);

	}


	$formulaire->setCheck(function($formulaire) use ($_id_promotion, $_id_ue) {
		    if (!$formulaire->isError()) {
			// SSi on tente d'enregistrer, alors on vérifie que le groupe entré n'existe pas déja
			// Pour le couple promotion/ue
			if ((!empty($_id_promotion))&&(!empty($_id_ue))&&($formulaire->isField('Type enseignement'))) {
			    if (shSGBD::count('SELECT count(DISTINCT groupe.id) '.
				    'FROM groupe '.
				    'INNER JOIN enseignement on groupe.id_enseignement = enseignement.id '.
				    'WHERE groupe.intitule=:intitule AND enseignement.id_ue=:id_ue '.
				    'AND enseignement.id_type_enseignement=:id_type_enseignement '.
				    'AND groupe.id_promotion=:id_promotion'
				    ,
				    array('id_type_enseignement' => $formulaire->getField('Type enseignement')->getValue(),
				    ':intitule' => $formulaire->getField('Groupe')->getValue(),
				    ':id_ue'=>$_id_ue,
				    ':id_promotion' => $_id_promotion)) > 0) {

				$formulaire->getField('Groupe')->setError('Un goupe pour ce couple Promotion / Ue a le même intulé');

			    }
			}
		    }
		}
		)
	;

	$formulaire->setSubmit(function($formulaire) use ($_id_promotion,$_id_ue,$promotion) {
		    if (!$formulaire->isField('Groupe')) {
			if ($_id_ue==null) {
			    shAction::redirect('administration','groupe','create',array($_id_promotion,$formulaire->getField('Ue')->getValue()));
			}else {
			    shAction::redirect('administration','groupe','create',array($_id_promotion,$_id_ue));
			}
		    }else {
			// On récup_re l'enseignement
			$enseignement = shSGBD::selectOne('SELECT id from enseignement '.
				'WHERE id_ue=:id_ue AND id_type_enseignement=:id_type_enseignement'
				,
				array (':id_ue'=>$_id_ue,
				':id_type_enseignement'=> $formulaire->getField('Type enseignement')->getValue())
			);


			shSGBD::insert('INSERT INTO groupe(id_enseignement,id_promotion,intitule) VALUES '.
				'(:id_enseignement,:id_promotion,:intitule)'
				,
				array(':id_enseignement' => $enseignement->id ,
				':id_promotion' => $_id_promotion ,
				':intitule' =>  $formulaire->getField('Groupe')->getValue()));
			shAction::redirect('administration','promotion',null,array($promotion->id_specialite));

		    }
		})







	;
	$this->assign('formulaire', $formulaire);
    }

    /**
     * Edition d'un groupe
     */
    public function executeEdit($_id_groupe) {

	// fil d'ariane
	$groupe = shSGBD::selectOne('SELECT id_promotion FROM groupe WHERE id=?', array($_id_groupe));
	$promotion = shSGBD::selectOne('SELECT id_specialite FROM promotion WHERE id=?',array($groupe->id_promotion));
	$this->addAriane(shRequest::link('administration', 'promotion',null,$promotion->id_specialite), 'Gestion des promotions');
	// FIN Fil d'Ariane

	$this->setTitle('Edition d\'un groupe');

	$formulaire = new shFormulaire;
	$formulaire->setSubmitText('Valider');

	// On récupère le groupe
	$groupe = shSGBD::selectOne('SELECT id,intitule,id_enseignement,id_promotion FROM groupe WHERE id=?', array($_id_groupe));

	shField::text('Intitulé du groupe')->setValue($groupe->intitule)->appendTo($formulaire);

	$formulaire->setCheck(function($formulaire)  use ($groupe) {
		    if (!$formulaire->isError()) {
			// On vérifie qu'un autre groupe ne porte pas le même intitule
			if (shSGBD::count('SELECT count(id) FROM groupe '.
				'WHERE id!=:id AND id_enseignement=:id_enseignement '.
				'AND id_promotion=:id_promotion AND intitule=:intitule '
				,
				array(':id' => $groupe->id,
				':id_enseignement' => $groupe->id_enseignement,
				':id_promotion' => $groupe->id_promotion,
				':intitule' => $formulaire->getField('Intitulé du groupe')->getValue())
				) > 0) {
			    $formulaire->getField('Intitulé du groupe')->setError('Un goupe pour ce couple Promotion / Ue a le même intulé');

			}
		    }
		})


	;

	$formulaire->setSubmit(function($formulaire) use ($groupe,$promotion) {
		    shSGBD::update('UPDATE groupe SET intitule=:intitule WHERE id=:id'
			    ,
			    array( ':intitule' => $formulaire->getField('Intitulé du groupe')->getValue(),
			    ':id' => $groupe->id));
		    shAction::redirect('administration','promotion',null,array($promotion->id_specialite));
		})


	;

	$this->assign('formulaire', $formulaire);
    }

    /**
     * Suppression d'un groupe
     */
    public function executeDelete($_id_groupe) {
	// Règle de suppression

	// 1
	//  --	On récupère le groupe à supprimer
	//  --	On le supprime
	$groupe = shSGBD::selectOne('SELECT id,intitule,id_enseignement,id_promotion FROM groupe WHERE id=?', array($_id_groupe));
	shSGBD::delete('DELETE FROM groupe WHERE id=?', array($_id_groupe));

	// 2
	//  --	On récupère toutes les séances du groupe
	//  --	On supprime toute trace de ce groupe dans la table participer
	$participer = shSGBD::select('SELECT id_seance FROM participer WHERE id_groupe=?', array($_id_groupe));
	shSGBD::delete('DELETE FROM participer WHERE id_groupe=?', array($_id_groupe));

	// 3
	//  --	Si dans participer il reste un groupe (même séance et même promo)
	//  --	On ne touche pas à mutualiser et séance
	//  --	On arrete le traitement
	$idsSeances = array();
	foreach ($participer as $parti) {
	    $idsSeances[] = $parti->id_seance;
	}

	$idsGroupes = array();
	$groupes = shSGBD::select('SELECT id FROM groupe WHERE id_promotion=?', array($groupe->id_promotion));
	foreach ($groupes as $gp) {
	    $idsGroupes[] = $gp->id;
	}

	$count = 0;
	if ((!empty($idsSeances))&&(!empty($idsGroupes))) {
	    $count = shSGBD::count('SELECT count(id_seance) FROM participer '.
		    'WHERE id_seance IN (?'.str_repeat(',? ', sizeof($idsSeances) - 1).') '.
		    'AND id_groupe IN (?'.str_repeat(',? ', sizeof($idsGroupes) - 1).') '
		    ,array_merge($idsSeances,$idsGroupes));
	}

	/*echo '<pre>'; var_dump($count);
	var_dump($idsSeances);
	var_dump($groupe->id_promotion);
	exit;*/

	if ($count == 0) {


	    // 4
	    //  --	Sinon on regarde si c'était le seul groupe dans mutualiser
	    //  --	Alors on supprime les liens dans mutualiser
	    if (!empty($idsSeances)) {
		shSGBD::delete('DELETE FROM mutualiser '.
			'WHERE id_seance IN (?'.str_repeat(',? ', sizeof($idsSeances) - 1).') '.
			'AND id_promotion=?',
			array_merge($idsSeances,array($groupe->id_promotion)));
	    }
	    // 5
	    //  --	On compte dans mutualiser et participer s'il reste la séance
	    //  --	Si c'est le cas on ne touche à rien et on s'arrête
	    //  --	Sinon on supprime la séance
	    shSGBD::delete('DELETE FROM seance '.
		    'WHERE seance.id NOT IN (SELECT id_seance from mutualiser) '.
		    'AND seance.id NOT IN (SELECT id_seance from participer)');

	}

        // On redirige vers la page promotion :
        // Pour ça on a besoin de connaitre l'identifiant de la spécialité
        $promotion = shSGBD::selectOne("SELECT id_specialite from promotion where id=?", array($groupe->id_promotion));

	shAction::redirect('administration','promotion',null,array($promotion->id_specialite));
    }

}
?>